/**
 * 工具方法
 * @param type  导出文件的类型：png、pdf
 * @param id  导出文档HTML节点ID
 */
import JsPDF from 'jspdf';
import html2canvas from 'html2canvas';

export function saveAs(type, el, name) {
	// pdf保存
	if (type === 'save') {
		html2canvas(el).then((canvas) => {
			// 通过html2canvas将html渲染成canvas，然后获取图片数据
			let imgData = canvas.toDataURL('image/jpeg');
			// 初始化pdf，设置相应格式
			let doc = new JsPDF('p', 'mm', 'a4');
			// 这里设置的是a4纸张尺寸
			doc.addImage(imgData, 'JPEG', 0, 0, 210, 297);
			// 输出保存命名为content的pdf
			doc.save(`${name}.pdf`);
		});
	}
	// pdf打印
	if (type === 'print') {
		html2canvas(el, {
		    allowTaint: false,
		    taintTest: false,
		    logging: false,
		    useCORS: true,
		    dpi: window.devicePixelRatio * 4, // 提高分辨率
		    scale: 4 // 按比例增加分辨率
		}).then((canvas) => {
		    // 获取canvas的图像数据
		    let imgData = canvas.toDataURL('image/jpeg', 0.92); // 设置JPEG质量，0.92是一个合理的平衡点
		
		    // 设置A4纸张宽度和高度（mm）
		    const a4Width = 297; // A4宽度
		    const a4Height = 210; // A4高度
		    
		    // 计算图像的宽高比例，保持原始比例
		    let imgWidth = a4Width;
		    let imgHeight = Math.floor(a4Width * canvas.height / canvas.width);
		
		    // 创建PDF实例
		    let doc = new JsPDF('l', 'mm', 'a4');
		    let yPosition = 0;
		
		    // 计算图像的分页
		    while (imgHeight > a4Height) {
		        // 添加部分图像到当前页
		        doc.addImage(imgData, 'JPEG', 0, yPosition, imgWidth, a4Height);
		        
		        // 更新剩余图像的高度
		        imgHeight -= a4Height;
		
		        // 如果还有剩余内容，添加新的一页
		        if (imgHeight > 0) {
		            doc.addPage();
		        }
		
		        // 更新y坐标为下一个位置
		        yPosition = 0; // 下一页从顶部开始
		    }
		
		    // 最后添加剩余部分图像
		    if (imgHeight > 0) {
		        doc.addImage(imgData, 'JPEG', 0, yPosition, imgWidth, imgHeight);
		    }
		
		    // 导出PDF并打开
		    const link = window.URL.createObjectURL(toBlob(doc.output('datauristring')));
		    const myWindow = window.open(link);
		});



	}
}

export function toBlob(base64Data) {
	let byteString = base64Data
	if (base64Data.split(',')[0].indexOf('base64') >= 0) {
		byteString = atob(base64Data.split(',')[1]); // base64 解码
	} else {
		byteString = unescape(base64Data.split(',')[1]);
	}
	// 获取文件类型
	const mimeString = base64Data.split(';')[0].split(":")[1]; // mime类型

	// ArrayBuffer 对象用来表示通用的、固定长度的原始二进制数据缓冲区
	// let arrayBuffer = new ArrayBuffer(byteString.length) // 创建缓冲数组
	// let uintArr = new Uint8Array(arrayBuffer) // 创建视图

	const uintArr = new Uint8Array(byteString.length); // 创建视图

	for (let i = 0; i < byteString.length; i += 1) {
		uintArr[i] = byteString.charCodeAt(i);
	}
	// 生成blob
	const blob = new Blob([uintArr], {
		type: mimeString
	})
	// 使用 Blob 创建一个指向类型化数组的URL, URL.createObjectURL是new Blob文件的方法,可以生成一个普通的url,可以直接使用,比如用在img.src上
	return blob;
};

export function outPutPdf(idName, pdfName, isDownload = false, isPrint = false, callback) {
	const element = document.getElementById(idName); // 这个dom元素是要导出的pdf的div容器
	const w = element.offsetWidth; // 获得该容器的宽
	const h = element.offsetHeight; // 获得该容器的高
	const offsetTop = element.offsetTop; // 获得该容器到文档顶部的距离  
	const offsetLeft = element.offsetLeft; // 获得该容器到文档最左的距离
	const canvas = document.createElement("canvas");
	let abs = 0;
	const winI = document.body.clientWidth; // 获得当前可视窗口的宽度（不包含滚动条）
	const winO = window.innerWidth; // 获得当前窗口的宽度（包含滚动条）
	if (winO > winI) {
		abs = (winO - winI) / 2; // 获得滚动条宽度的一半
	}
	canvas.width = w * 2; // 将画布宽&&高放大两倍
	canvas.height = h * 2;
	const context = canvas.getContext('2d');
	context.scale(2, 2);
	context.translate(-offsetLeft - abs, -offsetTop);
	// 这里默认横向没有滚动条的情况，因为offset.left()，有无滚动条的时候存在差值，因此translate的时候，要把这个差值去掉
	html2canvas(element, {
		useCORS: true, // 允许加载跨域的图片
		allowTaint: true,
		scale: 2 // 提升画面质量，但是会增加文件大小
	}).then(cs => {
		const contentWidth = cs.width;
		const contentHeight = cs.height;
		// 一页pdf显示html页面生成的canvas高度
		const pageHeight = contentWidth / 592.28 * 841.89;
		// 未生成pdf的html页面高度
		let leftHeight = contentHeight;
		// 页面偏移
		let position = 0;
		// a4纸的尺寸[595.28,841.89]，html页面生成的canvas在pdf中图片的宽高
		const imgWidth = 595.28;
		const imgHeight = 592.28 / contentWidth * contentHeight;
		const pageDate = cs.toDataURL('image/jpeg', 1.0);

		const pdf = new JsPDF('', 'pt', 'a4');
		// 有两个高度需要区分，一个是html页面的实际高度，和生成pdf的页面的高度（841.89）
		// 当内容未超过pdf一页显示的范围，无需分页
		if (leftHeight < pageHeight) {
			pdf.addImage(pageDate, 'JPEG', 0, position, imgWidth, imgHeight);
		} else { // 分页
			while (leftHeight > 0) {
				pdf.addImage(pageDate, 'JPEG', 0, position, imgWidth, imgHeight)
				leftHeight -= pageHeight;
				position -= 841.89;
				// 避免添加空白页
				if (leftHeight > 0) {
					pdf.addPage()
				}
			}
		}
		if (isDownload) {
			pdf.save(`${pdfName}.pdf`);
		}
		if (isPrint) {
			const link = window.URL.createObjectURL(toBlob(pdf.output('datauristring')));
			const myWindow = window.open(link);
			myWindow.print();
		}
		callback && callback(pdf);
	})
}

export const htmlToPdf = {

	getPdf(title, el) {

		// console.log(id);

		// loading = true;

		// console.log(loading);

		console.log(el);

		html2canvas(el, {
			allowTaint: false,
			taintTest: false,
			logging: false,
			width: el.width,
			height: el.height,
			useCORS: true,
			dpi: window.devicePixelRatio * 4, //将分辨率提高到特定的DPI 提高四倍
			scale: 4 //按比例增加分辨率
		}).then(canvas => {
			const pdf = new JsPDF('p', 'mm', 'a4'); //A4纸，纵向
			let ctx = canvas.getContext('2d'),
				// a4w = 190,
				a4w = 190,
				a4h = 277, //A4大小，210mm x 297mm，四边各保留10mm的边距，显示区域190x277
				imgHeight = Math.floor((a4h * canvas.width) / a4w), //按A4显示比例换算一页图像的像素高度
				renderedHeight = 0;
			while (renderedHeight < canvas.height) {
				const page = document.createElement('canvas');
				console.log(page);
				page.width = canvas.width;
				page.height = Math.min(imgHeight, canvas.height - renderedHeight); //可能内容不足一页
				//用getImageData剪裁指定区域，并画到前面创建的canvas对象中
				page.getContext('2d').putImageData(
					ctx.getImageData(
						0,
						renderedHeight,
						canvas.width,
						Math.min(imgHeight, canvas.height - renderedHeight)
					),
					0,
					0
				);
				pdf.addImage(
					page.toDataURL('image/jpeg', 1.0),
					'JPEG',
					10,
					10,
					a4w,
					Math.min(a4h, (a4w * page.height) / page.width)
				); //添加图像到页面，保留10mm边距
				renderedHeight += imgHeight;
				if (renderedHeight < canvas.height) {
					pdf.addPage(); //如果后面还有内容，添加一个空页
				}
				// delete page;
			}

			//保存文件

			// pdf.save(title + '.pdf');
			const link = window.URL.createObjectURL(toBlob(pdf.output('datauristring')));
			const myWindow = window.open(link);
			myWindow.print();


		});

	}

};